package com.ts.api.module.api.convert.core.entity;

import com.alibaba.fastjson.TypeReference;
import com.gitee.apanlh.exp.HttpBodyParseException;
import com.gitee.apanlh.util.algorithm.digest.MD5;
import com.gitee.apanlh.util.dataformat.JsonUtils;
import com.gitee.apanlh.util.net.http.HttpBody;
import com.gitee.apanlh.util.net.http.HttpClient;
import com.gitee.apanlh.util.net.http.HttpRequest;
import com.gitee.apanlh.util.net.http.handler.body.HttpBodyParseStrategy;
import com.gitee.apanlh.util.valid.ValidParam;
import com.ts.api.common.redis.ApiMatchRedisKey;
import lombok.Data;

import java.util.Map;

/**
 *  API进件消息实体类
 *
 *  @author Pan
 */
@Data
public class ApiApplyParameter extends ApiRequestParameter {

    /** 用户同意授权协议地址 */
    private String acceptProtocolUrl;
    /** 请求id */
    private String reqId;
    /** userId */
    private Long userId;
    /** 渠道id */
    private Long loanChannelId;
    /** 主体id */
    private Long productId;
    /** 计划id */
    private Long productPlanId;
    /** api渠道编号 */
    private String apiClientId;
    /** 0测试环境 1正式环境 */
    private Integer envType;
    /** 进件携带id */
    private String applyId;
    /** 是否本地库存在 "true"存在 "false"不存在 */
    private String existLocal;

    /** -----------------------用户信息----------------------- */
    /** 用户手机号 */
    private String phone;
    /** 用户手机号Md5 */
    private String phoneMd5;
    /** 手机号掩码 */
    private String phoneMask;
    /** 用户姓名 */
    private String userName;
    /** 0：男；1：女； 2 未知  */
    private String sex;
    /** 银行卡 */
    private String bankCard;
    /** 身份证 */
    private String idcard;
    /** 城市 */
    private String city;
    /** 市级区域code */
    private String areaCode;
    /** ip地址 */
    private String ip;
    /** 用户资质表单备注 */
    private String formRemark;
    /** 归属省份code */
    private String provinceCode;
    /** 归属省份名称 */
    private String provinceName;

    /** -----------------------表单信息----------------------- */
    /** 年龄 */
    private String age;
    /**
     *  信用情况（逾期）
     *  1.无逾期
     *  2.当前有逾期
     *  3.一年以内无逾期
     * */
    private String overdue;
    /**
     *  车辆情况
     *  1.无车产
     *  2.有车不抵押
     *  3.有车可抵押
     *  4.有车
     * */
    private String carInfo;
    /**
     *  贷款金额
     *  1.3万以下
     *  2.5万-10万
     *  3.10万-20万
     *  4.20万以上
     * */
    private String loanAmount;
    /**
     *  贷款期限
     *  1.3个月
     *  2.6个月
     *  3.12个月
     *  4.24个月
     *  5.36个月
     *  6.60个月
     */
    private String loanTerm;
    /**
     *  营业执照注册年限
     *  1.未注册
     *  2.注册1年以下
     *  3.注册1~5年
     *  4.注册5年以上
     * */
    private String bizLicenseYear;
    /**
     *  蚂蚁花呗可用额度
     *  1.无额度
     *  2.3千以下
     *  3.3千-1万
     *  4.1万-3万
     *  5.3万以上
     * */
    private String hbLimit;
    /**
     *  京东白条可用额度
     *  1.无额度
     *  2.3千以下
     *  3.3千-1万
     *  4.1万-3万
     *  5.3万以上
     * */
    private String btLimit;
    /**
     *  芝麻分
     *  1.600分以下
     *  2.600~649分
     *  3.650~699分
     *  4.700分以上
     * */
    private String sesameCredit;
    /**
     *  职业
     *  1.上班族
     *  2.自由职业
     *  3.企业主（有营业执照）
     *  4.公务员或事业单位
     *  5.个体户
     * */
    private String career;
    /**
     *  社保缴纳
     *  1.无社保
     *  2.缴纳6个月以下
     *  3.缴纳6个月以上
     *  4.有社保
     * */
    private String socialSecurity;
    /**
     *  月收入
     *  1.1000-3000
     *  2.3000-8000
     *  3.8000~15000
     *  4.15000~30000
     *  5.30000以上
     * */
    private String monthlySalary;
    /**
     *  房产情况
     *  1.无房产
     *  2.有房不抵押
     *  3.有房可抵押
     *  4.有房产
     *  5.有按揭房产
     *  6.有全款房产
     * */
    private String realEstateInfo;
    /**
     *  总经营流水
     *  1.10~50万元
     *  2.50~100万元
     *  3.100~500万元
     * */
    private String bizBankDetails;
    /**
     *  收入形式-工资发放形式
     *  1.银行代发打卡
     *  2.现金收入
     *  3.个人转账
     * */
    private String salaryPayMethod;
    /**
     *  对公账户经营收入
     *  1.10~50万元
     *  2.50~100万元
     *  3.100~500万元
     * */
    private String bizPubAccBankDetails;
    /**
     *  公积金
     *  1.无公积金
     *  2.缴纳6个月以下
     *  3.缴纳6个月以上
     *  4.有公积金
     * */
    private String providentFund;
    /**
     *  信用卡额度
     *  1.无信用卡
     *  2.3千以下
     *  3.3千-1万
     *  4.1-3万
     *  5.3万以上
     *  6.有信用卡
     * */
    private String creditLimit;
    /**
     *  保险保单
     *  1.无保险保单
     *  2.缴纳未满1年
     *  3.缴纳1年以上
     *  4.有保险保单
     * */
    private String insurancePolicy;
    /**
     *  借款用途
     *  1.旅游
     *  2.教育
     *  3.婚庆
     *  4.装修
     *  5.医疗
     *  6.个人消费
     * */
    private String loanPurpose;
    /**
     *  单位工龄
     *  1.0-6个月
     *  2.6-12个月
     *  3.12个月以上
     * */
    private String yearsService;
    /**
     *  学历
     *  1.初中及以下
     *  2.中专
     *  3.高中
     *  4.大专
     *  5.本科
     *  6.研究生及以上
     * */
    private String educationAttainment;

    public ApiApplyParameter() {
        super();
    }

    /**
     *  转化请求方式为NameValuePair格式(值对节点类型)
     *
     * 	@author Pan
     *  @param  paramMap 请求参数
     *  @return	String
     */
    public void appendExtendUrl(Map<String, Object> paramMap) {
        HttpBodyParseStrategy httpBodyParseStrategy = new HttpBodyParseStrategy() {
            @Override
            public <V> String toNameValuePair(Map<String, V> paramMap, boolean hasParamUrlEncode) {
                return HttpBodyParseStrategy.super.toNameValuePair(paramMap, hasParamUrlEncode);
            }

            @Override
            public Map<String, ?> beanToLinkedMap(HttpBody httpBody) {
                return HttpBodyParseStrategy.super.beanToLinkedMap(httpBody);
            }

            @Override
            public HttpRequest parse(HttpRequest httpRequest, HttpClient httpClient) throws HttpBodyParseException {
                return null;
            }
        };
        String queryParam = httpBodyParseStrategy.toNameValuePair(paramMap, true);
        this.setExtendUrl("?" + queryParam);
    }

    /**
     *  获取撞库applyId
     *
     *  @return String
     */
    public String dataExchangeApplyId() {
        //  如果手机号md5在外层未被设置，将phone设置为phoneMd5
        if (ValidParam.isEmpty(this.getPhoneMd5())) {
            if (ValidParam.isNotEmpty(this.getPhone())) {
                this.setPhoneMd5(MD5.create().digestToHex(this.getPhone()));
            }
        }

        String key = ApiMatchRedisKey.getDataExchangeUniqueIdByPhoneMd5(this.getProductId(), this.getProductPlanId(), this.getPhoneMd5());
        Object value = ApiMatchRedisKey.DOWNSTREAM_EXTEND.get(key);
        if (value == null) {
            return null;
        }

        //  撞库返回id以及phoneMd5
        Map<String, String> valueMap = JsonUtils.toBean((String) value, new TypeReference<>() {});
        return valueMap.get("applyId");
    }
}
